home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Games / connx-1.0 / connect.c < prev    next >
C/C++ Source or Header  |  1995-06-25  |  3KB  |  165 lines

  1. /*
  2.  * Used by server to play the game.
  3.  */
  4.  
  5. #include "connect.h"
  6.  
  7. /* globals */
  8. int the_game, num_pieces, num_rows, num_columns, num_players, num_to_connect;
  9. board conn_board;
  10.  
  11. /* prototpyes */
  12. int board_piece (int row, int column);
  13.  
  14. /**************************************************************************/
  15. /* MAIN ROUTINES **********************************************************/
  16. /**************************************************************************/
  17.  
  18. /*
  19.  * start a new game
  20.  */
  21. void 
  22. allocate (int game_type, int rows, int columns, int players, int conn)
  23. {
  24.   num_rows = rows;
  25.   num_columns = columns;
  26.   bzero (conn_board, sizeof (board));
  27.   num_players = players;
  28.   num_to_connect = conn;
  29.   num_pieces = 0;
  30.   the_game = game_type;
  31. }
  32.  
  33. /***************************************************************************/
  34.  
  35. /*
  36.  * called for each players move
  37.  */
  38. int 
  39. add_to_board (coord * move, int player_no)
  40. {
  41.   int i;
  42.  
  43.   if (the_game == GRAVITY)
  44.     {
  45.       if (move->column < 0 || move->column >= num_columns)
  46.     return -1;
  47.  
  48.  
  49.       if (conn_board[0][move->column] != 0)
  50.     return -1;        /*column is full */
  51.  
  52.       i = num_rows - 1;
  53.       while (conn_board[i][move->column] != 0)
  54.     i--;
  55.  
  56.       conn_board[i][move->column] = player_no;
  57.       move->row = i;
  58.     }
  59.  
  60.   else
  61.     /*game type is NOGRAVITY */
  62.     {
  63.       if (move->column < 0 || move->column >= num_columns ||
  64.       move->row < 0 || move->row >= num_rows)
  65.     return -1;
  66.  
  67.       if (conn_board[move->row][move->column] != 0)
  68.     return -1;        /*spot already taken */
  69.       else
  70.     conn_board[move->row][move->column] = player_no;
  71.     }
  72.  
  73.   num_pieces++;
  74.   return 0;
  75.  
  76. }
  77.  
  78. /****************************************************************************/
  79.  
  80. int 
  81. check_for_win (coord piece, coord * begin, coord * end)
  82. {
  83.   int num;
  84.   int player_no;
  85.   int row, col;
  86.   int i, j, k;
  87.   int to_add[4][2] =
  88.   {
  89.     {0, 1},
  90.     {1, 1},
  91.     {1, -1},
  92.     {1, 0}};
  93.  
  94.   for (k = 0; k < 4; k++)
  95.     {
  96.       num = 0;
  97.       i = to_add[k][0];
  98.       j = to_add[k][1];
  99.  
  100.       row = piece.row;
  101.       col = piece.column;
  102.       player_no = conn_board[row][col];
  103.  
  104.       while (board_piece (row, col) == player_no)
  105.     {
  106.       num++;
  107.       end->row = row;
  108.       end->column = col;
  109.       row = row + i;
  110.       col = col + j;
  111.     }
  112.  
  113.  
  114.       row = piece.row;
  115.       col = piece.column;
  116.       num--;
  117.  
  118.       while (board_piece (row, col) == player_no)
  119.     {
  120.       num++;
  121.       begin->row = row;
  122.       begin->column = col;
  123.       row = row - i;
  124.       col = col - j;
  125.     }
  126.  
  127.       if (num >= num_to_connect)
  128.     return 0;
  129.  
  130.     }
  131.   return -1;
  132.  
  133. }
  134.  
  135.  
  136. /**************************************************************************/
  137.  
  138. int 
  139. check_for_tie ()
  140. {
  141.   if (num_pieces >= (num_rows * num_columns))
  142.     return 0;
  143.   else
  144.     return -1;
  145. }
  146.  
  147.  
  148. /*****************************************************************************/
  149. /*internals*******************************************************************/
  150. /*****************************************************************************/
  151.  
  152. /*
  153.  * get player number who has piece at row, column
  154.  */
  155. int 
  156. board_piece (int row, int column)
  157. {
  158.   if (row < 0 || column < 0 || row >= num_rows || column >= num_columns)
  159.     return -1;
  160.   else
  161.     return conn_board[row][column];
  162. }
  163.  
  164. /****************************************************************************/
  165.